//
//  SuperMan.m
//  07-内存管理
//
//  Created by 曹曹 on 16/7/12.
//  Copyright © 2016年 曹曹. All rights reserved.
//

#import "SuperMan.h"

@implementation SuperMan
- (void)dealloc {
    NSLog(@"对象被释放");
    // 释放所有的属性生成的成员变量(语义属性为retain, copy的需要释放)
    [_name release];
    [_mId release];
    [_sexual release];
    [_mDescription release];
    [_gayBoy release];
    [super dealloc];
}
#pragma mark - 协议方法的实现是在签订者的.m文件中
- (void)sayHello {
    NSLog(@"Hello, I'm Not Gay");
}
#pragma mark - NSCopying协议方法
- (id)copyWithZone:(NSZone *)zone {
    // 开辟新的空间, 创建一个新的对象
    SuperMan *man = [[SuperMan allocWithZone:zone] init];
    // 浅拷贝, 只创建了新的对象, 但是所有的属性还指向原来的属性
    man.name = self.name;
    man.sexual = self.sexual;
    // 深拷贝, 不只创建新的对象, 所有的属性也对应的拷贝一份新的
    man.name = [self.name copy];
    man.sexual = [self.sexual copy];
    return man;
}
// 赋值, 在这个方法中, 编写找不到key值的处理措施
- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
    if ([key isEqualToString:@"id"]) {
//        _mId = value;
        // 赋值时使用setter方法, 防止野指针
        self.mId = value;
    }
    if ([key isEqualToString:@"description"]) {
//        _mDescription = value;
        self.mDescription = value;
    }
}
// 取值
- (id)valueForUndefinedKey:(NSString *)key {
    return nil;
}
#pragma mark - MRC下的setter方法
// assign修饰的属性的setter方法
- (void)setNumber:(NSInteger)number {
    _number = number;
}
// retain修饰的属性的setter方法
- (void)setName:(NSString *)name {
    if (_name != name) {
        [_name release];
        _name = [name retain];
    }
}
// copy修饰的属性的setter方法
- (void)setMId:(NSString *)mId {
    if (_mId != mId) {
        [_mId release];
        _mId = [mId copy];
    }
}
@end
